﻿namespace Blaze.Editor.Dev
{
    using System;
    using UnityEditor;
    using UnityEngine;

    /// <summary>
    /// 开发功能面板抽象基类。
    /// </summary>
    public abstract class DevPanel
    {
        /// <summary>
        /// 获取面板上显示的功能名称。
        /// </summary>
        public abstract string Name { get; }

        /// <summary>
        /// 获取开发功能面板的显示优先级。
        /// </summary>
        public virtual int Priority
        {
            get { return 1000; }
        }

        /// <summary>
        /// 获取或设置开发面板所在的窗口。
        /// </summary>
        public DevWindow Window { get; set; }

        /// <summary>
        /// 获取功能面板所使用的皮肤设置。
        /// </summary>
        protected static GUISkin GUISkin
        {
            get
            {
                if (mSkin == null)
                {
                    mSkin = ScriptableObject.CreateInstance<GUISkin>();
                    mSkin.button = GUI.skin.button;
                }
                return mSkin;
            }
        }

        /// <summary>
        /// 当面板取消选中的时候调用此方法。
        /// </summary>
        public virtual void OnDisable()
        {
        }

        /// <summary>
        /// 当面板被选中的时候调用此方法。
        /// </summary>
        public virtual void OnEnable()
        {
        }

        /// <summary>
        /// 当需要绘制面板时调用此方法。
        /// </summary>
        public virtual void OnGUI()
        {
        }

        /// <summary>
        /// 当需要更新面板时调用此方法。
        /// </summary>
        public virtual void OnUpdate()
        {
        }

        /// <summary>
        /// 刷新功能面板。
        /// </summary>
        public void Update()
        {
            if (!mIsInitialized)
            {
                try
                {
                    OnInitialize();
                    mIsInitialized = true;
                }
                catch (Exception e)
                {
                    EditorGUILayout.HelpBox(e.Message + "\r\n" + e.StackTrace, MessageType.Error, true);
                    return;
                }
            }
            if (!EditorApplication.isCompiling)
                OnGUI();
        }

        /// <summary>
        /// 设置当前的GUI背景颜色。
        /// </summary>
        protected void BeginBackgroundColor(Color color)
        {
            mLastBackgroundColor = GUI.backgroundColor;
            GUI.backgroundColor = color;
        }

        /// <summary>
        /// 还原当前的GUI背景颜色。
        /// </summary>
        protected void EndBackgroundColor()
        {
            GUI.backgroundColor = mLastBackgroundColor;
        }

        /// <summary>
        /// 当面板需要初始化的时候调用。
        /// </summary>
        protected virtual void OnInitialize()
        {
        }

        private static GUISkin mSkin;
        private bool mIsInitialized;
        private Color mLastBackgroundColor;
    }
}